Semantik Web  •  Hafta 03

RDF & RDFS

Üçlü modeli, graf düşünme, Turtle sözdizimi ve alerji sözlüğünün kurulması

Lisansüstü Semantik Web Dersi  •  CMPE 583

Hafta 03  •  Kazanımlar

Bu hafta sonunda

  • Alerji verisini üçlülerle modelleyip Turtle ile yazabileceksiniz.
  • IRI, literal ve blank node ayrımını doğru yapabileceksiniz.
  • RDFS ile sınıf ve özellik hiyerarşisi kurabileceksiniz.
  • domain/range'in kısıt değil çıkarım ürettiğini gösterebileceksiniz.
  • Temel SPARQL sorgularıyla grafı sorgulayabileceksiniz.

Geçen haftadan hatırlatma

  • XML ağaçtır: her düğümün tek ebeveyni vardır.
  • Bağlar adsızdır; ref="Nisin" yalnızca bir metindir.
  • XPath bildirilmiş veriyi sorgular; risk zincirini kuramaz.
  • Bu hafta aynı veriyi graf olarak yeniden kuruyoruz.

01

Ödev 2'nin Çözümü

XML tasarım kararları, şema kısıtları ve hata analizi.

Çözüm 2.1 — Tasarım kararları

AlanKararGerekçe
ean, tcAttributeKimlik, tekil, yapısı yok
nameElementAlan verisi, uzun olabilir
allergyElement (çoklu)Bir kişide birden çok olabilir
unitAttributeDeğerin meta bilgisi
BMIYokHesaplanır, saklanmaz

Çözüm 2.2 — Şema kısıtları

<xs:pattern value="EAN_[0-9]{5}"/> <xs:minInclusive value="0"/> <xs:maxInclusive value="120"/> <xs:enumeration value="Lactose"/>
  • Barkod: desen — kimlik biçimi sabittir.
  • Yaş: aralık — 0–120 dışı veri hatalıdır.
  • Alerji: enumeration — kapalı küme, yazım hatası yakalanır.

Çözüm 2.3 — Üç doğrulama hatası

SatırHataMesaj
count="two"Tip uyuşmazlığınot a valid value for 'int'
ean="EAN_105"Desen ihlalinot facet-valid with pattern
additive önce, name sonraSıra ihlaliInvalid content: 'name' expected

Sıra hatası yalnızca xs:sequence ile ortaya çıkar; xs:all kullanılsaydı geçerli olurdu.

02

RDF: Veri Modeli

Üçlüler, graf, IRI, literal ve serileştirmeler.

RDF nedir?

  • Kaynaklar arasındaki ilişkileri üçlülerle ifade eden bir veri modeli.
  • Belge değil graf: sıra yoktur, tekrar yoktur, birleştirme serbesttir.
  • Her kaynak bir IRI ile küresel olarak adlandırılır.
  • Sözdizimi değil model: Turtle, RDF/XML, JSON-LD aynı grafı yazar.

Üçlü: özne — yüklem — nesne

EAN_00004
Contain──────▶
Nisin
Triggers──────▶
Lactose
BileşenNe olabilirÖrnek
ÖzneIRI veya blank node:EAN_00004
YüklemYalnızca IRI:Contain
NesneIRI, blank node veya literal:Nisin / "Eti Chocolate"

Üç düğüm türü

IRI

:Nisin

Küresel kimlik; başka grafla birleşir.

Literal

"67.5"^^xsd:double

Veri değeri; özne olamaz.

Blank node

_:b1

Adı olmayan ara düğüm; yereldir.

Alerji grafının bir kesiti

TC_001 ──hasAllergy──▶ Lactose TC_001 ──ChooseProduct──▶ EAN_00004 EAN_00004 ──Contain──▶ Nisin Nisin ──Triggers──▶ Lactose

Lactose düğümü iki farklı yoldan işaretlenir. Bu paylaşılan düğüm, riskin çıkarılmasını sağlayan yapıdır; XML ağacında böyle bir paylaşım yoktur.

Aynı üçlü, üç yazım biçimi

Turtle:Nisin :Triggers :Lactose .
N-Triples<http://EMU/AllergyOntology#Nisin> <...#Triggers> <...#Lactose> .
RDF/XML<rdf:Description rdf:about="#Nisin"> <Triggers rdf:resource="#Lactose"/> </rdf:Description>

Projedeki dosya RDF/XML'dir; derste okumayı kolaylaştırmak için çoğu örneği Turtle ile yazacağız.

Turtle: önek bildirimi

@prefix : <http://EMU/AllergyOntology#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . :Nisin a :FoodAdditives .

a kısayolu rdf:type anlamına gelir. Boş önek (:) projenin kendi namespace'idir.

Turtle kısayolları

Uzun yazım

:EAN_00004 a :Product . :EAN_00004 :Contain :Nisin . :EAN_00004 :Contain :Soy_Lecitin .

Kısayollu

:EAN_00004 a :Product ; :Contain :Nisin , :Soy_Lecitin .

; aynı özneyi sürdürür, , aynı yüklemi sürdürür.

Projeden: ürünler Turtle ile

:EAN_00001 a :Product ; :hasProductName "ETI Cracker" ; :Contain :Alginic_Acid . :EAN_00002 a :Product ; :hasProductName "Ulker Damak" ; :Contain :Phospore , :Soy_Lecitin .
:EAN_00003 a :Product ; :hasProductName "Dardanel Ton" ; :Contain :Casein , :Sodium_Ascorbite . :EAN_00004 a :Product ; :hasProductName "Eti Chocolate" ; :Contain :Ascorbic_Acid , :Nisin , :Soy_Lecitin .

Projeden: katkı maddeleri ve tetikleme

:Nisin a :FoodAdditives ; :Triggers :Lactose . :Casein a :FoodAdditives ; :Triggers :Lactose . :Soy_Lecitin a :FoodAdditives ; :Triggers :Egg ; rdfs:label "Soy Lecithin" .
:Sodium_Ascorbite a :FoodAdditives ; :Triggers :Fish . :Alginic_Acid a :FoodAdditives ; :Triggers :Gluten . :Ascorbic_Acid a :FoodAdditives . # tetikleme bilgisi YOK → bilinmiyor

Son satır önemlidir: açık dünyada eksik üçlü "tetiklemez" demek değildir.

Projeden: kişiler Turtle ile

:TC_001 a :Person ; :hasName "Ayse" ; :hasAge "38"^^xsd:int ; :hasWeight "67.5"^^xsd:double ; :hasHeight "1.68"^^xsd:double ; :hasAllergy :Lactose ; :ChooseProduct :EAN_00004 .
:TC_003 a :Person ; :hasName "MEHMET" ; :hasAge "35"^^xsd:int ; :hasWeight "93.0"^^xsd:double ; :hasHeight "1.87"^^xsd:double ; :hasAllergy :Fish , :Lactose ; :ChooseProduct :EAN_00003 .

Literal: tip ve dil etiketi

YazımAnlamı
"38"^^xsd:intTam sayı — aritmetiğe girer
"38"Metin — S4 kuralında çalışmaz
"Riskli Kişi"@trTürkçe etiket
"Person At Risk"@enİngilizce etiket

Projede en sık görülen hata: yaşın tip verilmeden yazılması. swrlb:greaterThanOrEqual built-in'i metinle çalışmaz ve S5 kuralı sessizce hiçbir sonuç üretmez.

Blank node ne zaman kullanılır?

# Miktar bilgisi olan içerik :EAN_00004 :hasIngredient [ :additive :Nisin ; :amountMg "12.5"^^xsd:double ] .
  • Kimlik vermeye değmeyen ara yapı için.
  • OWL kısıtları da blank node olarak yazılır (Hafta 05).
  • Dezavantaj: dışarıdan referans verilemez, birleştirmede eşleşmez.

Graf birleştirme: iki kaynak, tek graf

Market kataloğu

:EAN_00004 :Contain :Nisin .

Sağlık kaynağı

:Nisin :Triggers :Lactose .

İki kaynak aynı IRI'yi kullandığı için birleşme kendiliğinden olur; eşleme tablosu, ETL veya JOIN yazmaya gerek yoktur. Bu, RDF'in tek en büyük pratik faydasıdır.

RDF/XML: projedeki dosyanın dili

<owl:NamedIndividual rdf:about="#TC_001"> <rdf:type rdf:resource="#Person"/> <ChooseProduct rdf:resource="#EAN_00004"/> <hasAllergy rdf:resource="#Lactose"/> <hasAge rdf:datatype="&xsd;int">38</hasAge> <hasName rdf:datatype="&xsd;string">Ayse</hasName> </owl:NamedIndividual>
YapıAnlamı
rdf:aboutÖznenin IRI'si
rdf:resourceNesne bir IRI
rdf:datatypeNesne tipli literal

Adlandırılmış graf: bilgi nereden geldi?

:EAN_00004 :Contain :Nisin <http://EMU/graph/market> . :Nisin :Triggers :Lactose <http://EMU/graph/health> . :TC_001 :hasAllergy :Lactose <http://EMU/graph/patient> .

Dördüncü öge kaynağı söyler. Bir gıda güvenliği sisteminde "bu riski hangi kaynak bildirdi?" sorusunun cevabı budur — Hafta 01'deki Proof/Trust katmanının pratik karşılığı.

03

SPARQL ile Sorgulama

Graf desenleri, filtreler ve alerji sorguları.

SPARQL: desen eşleme

PREFIX : <http://EMU/AllergyOntology#> SELECT ?urun ?ad WHERE { ?urun a :Product ; :hasProductName ?ad . } ORDER BY ?ad

WHERE bloğu bir graf desenidir: değişkenler grafa oturtulur, her oturum bir satır üretir.

Sorgu 1 — Nisin içeren ürünler

SELECT ?ad WHERE { ?u :Contain :Nisin ; :hasProductName ?ad . }
?ad ───────────────── "Eti Chocolate"

Bu sorgu XPath ile de yazılabilirdi. Farkı bir sonraki slaytta göreceğiz.

Sorgu 2 — Riskli seçimler (zincir)

SELECT ?kisi ?urun ?katki ?alerji WHERE { ?kisi a :Person ; :hasAllergy ?alerji ; :ChooseProduct ?urun . ?urun :Contain ?katki . ?katki :Triggers ?alerji . }
TC_001 EAN_00004 Nisin Lactose TC_002 EAN_00003 Casein Lactose TC_003 EAN_00003 Casein Lactose TC_003 EAN_00003 Sodium_Ascorbite Fish

Aynı desen S6 kuralının gövdesidir. Fark: SPARQL sorar, SWRL yazar — sonuç ontolojide kalıcı olur.

FILTER ve OPTIONAL

Yetişkinler

SELECT ?ad WHERE { ?p :hasName ?ad ; :hasAge ?y . FILTER (?y >= 18) }

Etiketi olmayan katkılar da listelensin

SELECT ?k ?etiket WHERE { ?k a :FoodAdditives . OPTIONAL { ?k rdfs:label ?etiket } }

OPTIONAL, açık dünyayla uyumlu çalışmanın yoludur: eksik veri satırı düşürmez.

ASK ve CONSTRUCT

ASK — evet/hayır

ASK { :TC_001 :ChooseProduct ?u . ?u :Contain :Nisin . } # true

CONSTRUCT — yeni üçlü

CONSTRUCT { ?p :Effected_Allergen ?f . } WHERE { ?p :hasAllergy ?a ; :ChooseProduct ?u . ?u :Contain ?f . ?f :Triggers ?a . }

CONSTRUCT, SWRL kuralına en yakın SPARQL yapısıdır; ancak sonucu ayrı bir graf olarak döner, ontolojiye yazmaz.

04

RDFS: Sözlük Katmanı

Sınıflar, hiyerarşi, domain/range ve RDFS çıkarımı.

RDFS ne ekler?

  • RDF yalnızca üçlüleri verir; RDFS bu üçlülere sözlük kazandırır.
  • Sınıf ve özellik hiyerarşisi tanımlanır.
  • Özelliklerin hangi türler arasında geçtiği bildirilir.
  • Küçük ama gerçek bir çıkarım kümesi elde edilir.

Sınıflar ve alt sınıflar

:Person a rdfs:Class . :Adult a rdfs:Class ; rdfs:subClassOf :Person . :PersonAtRisk a rdfs:Class ; rdfs:subClassOf :Person .
Person ├── Adult └── PersonAtRisk

Çıkarım: :Adult(:TC_001) verilirse :Person(:TC_001) otomatik doğrudur.

Alt özellikler: projedeki alerjen ağacı

:Effected_Allergen a rdf:Property . :Lactose_Allergen rdfs:subPropertyOf :Effected_Allergen . :Egg_Allergen rdfs:subPropertyOf :Effected_Allergen . :Fish_Allergen rdfs:subPropertyOf :Effected_Allergen . :Gluten_Allergen rdfs:subPropertyOf :Effected_Allergen .
S2 → :TC_001 :Lactose_Allergen :Casein çıkarım ⇩ :TC_001 :Effected_Allergen :Casein

S7 kuralı yalnızca üst özelliğe bakar; alt özellikleri yazmak yeterlidir.

domain ve range

:Contain rdfs:domain :Product ; rdfs:range :FoodAdditives . :Triggers rdfs:domain :FoodAdditives ; rdfs:range :Allergy . :hasAge rdfs:domain :Person ; rdfs:range xsd:int .
BildirimOkunuşu
domainBu özelliğin öznesi şu sınıftandır
rangeBu özelliğin nesnesi şu sınıftandır

Dikkat: domain bir kısıt değildir

Verilen

:TC_009 :Contain :Nisin .

Beklenen vs gerçekleşen

Beklenen : hata / uyarı Gerçek : :TC_009 a :Product (çıkarıldı!)

Projede Person ve Product ayrık tanımlıdır; işte bu yüzden yukarıdaki durum tutarsızlık olarak yakalanır. Ayrıklık aksiyomu olmasa hata sessizce yanlış çıkarıma dönerdi.

RDFS çıkarım kuralları

VerilenÇıkarılan
P rdfs:domain C . x P yx a C
P rdfs:range C . x P yy a C
C rdfs:subClassOf D . x a Cx a D
P rdfs:subPropertyOf Q . x P yx Q y

Dört satır, projedeki çıkarımların önemli bir kısmını üretir — SWRL'e gerek kalmadan.

Çıkarım örneği: dört adım

verili:EAN_00004 :Contain :Nisin .
domain →:EAN_00004 a :Product
range →:Nisin a :FoodAdditives
subProp →:TC_001 :Effected_Allergen :Casein
subClass →:TC_001 a :Person  (Adult üzerinden)

Bunların hiçbiri dosyada yazılı değildir; hepsi RDFS düzeyinde üretilir.

Etiket ve açıklama: insan için katman

:PersonAtRisk rdfs:label "Person At Risk"@en , "Riskli Kişi"@tr ; rdfs:comment "Seçtiği ürün, alerjisini tetikleyen bir katkı içeren kişi."@tr . :Soy_Lecitin rdfs:label "Soya lesitini"@tr , "Soy Lecithin"@en .

Projede bu etiketler hazırdır: arayüz Türkçe, IRI'ler ASCII kalır. Çıkarım bu üçlülerden etkilenmez — yalnızca sunum içindir.

Alerji sözlüğünün tasarımı

KararSeçimNeden
Alerji türleriBireyYeni tür eklemek şema değiştirmesin
Katkı maddeleriBireySomut maddeler
Alerjen ilişkisiAlt özellikGenel + türe özgü sorgulama
Riskli kişiAlt sınıfKuralla doldurulur

RDFS nerede yetmez?

İhtiyaçRDFSÇözüm
Person ile Product ayrık olsunYokOWL disjoint
Her ürün en az bir katkı içersinYokOWL cardinality
Alerjeni olan kişi risklidirYokOWL restriction / SWRL
BMI hesabıYokSWRL built-in
Tutarsızlık denetimiYokReasoner (HermiT)

Hafta 04'te bu satırların tamamını OWL ile karşılayacağız.

Protégé'de göreceğiniz ekran: OntoGraf

EntitiesIndividuals by classOntoGraf
TC_001 ──hasAllergy──▶ Lactose ◀──Triggers── Nisin
TC_001 ──ChooseProduct──▶ EAN_00004 ──Contain──▶ Nisin

Şematik gösterim. İki satırın kapandığı yer — Nisin ve Lactose — riskin bulunduğu döngüdür.

Java + Jena: grafı okumak

Model m = ModelFactory.createDefaultModel(); m.read("ALLERGY_FIXED.owl"); String NS = "http://EMU/AllergyOntology#"; Property contain = m.getProperty(NS + "Contain"); StmtIterator it = m.listStatements(null, contain, (RDFNode) null); while (it.hasNext()) { Statement st = it.nextStatement(); System.out.println(st.getSubject().getLocalName() + " -> " + st.getObject().asResource().getLocalName()); }

Jena RDF/RDFS düzeyinde çalışır. Projede OWL API kullanacağız (Hafta 08), çünkü aksiyom ve kural desteği gerekiyor.

Java + Jena: SPARQL çalıştırmak

String q = "PREFIX : <http://EMU/AllergyOntology#> " + "SELECT ?p ?f WHERE { " + " ?p :ChooseProduct ?u . ?u :Contain ?f . " + " ?f :Triggers ?a . ?p :hasAllergy ?a }"; try (QueryExecution qe = QueryExecutionFactory.create(q, m)) { ResultSet rs = qe.execSelect(); while (rs.hasNext()) { QuerySolution s = rs.next(); System.out.println(s.getResource("p").getLocalName() + " risk: " + s.getResource("f").getLocalName()); } }

05

Ödev ve Proje Adımı

Kataloğunuzu RDF'e taşıyın ve sözlüğünü kurun.

Ödev 3 — Alerji grafı ve sözlüğü

  1. Hafta 02'deki XML'inizi Turtle'a çevirin (en az 40 üçlü).
  2. RDFS ile sınıf ve alt özellik hiyerarşisini kurun.
  3. Tüm özelliklere domain/range bildirin.
  4. İki dilli rdfs:label ekleyin.
  5. Üç SPARQL sorgusu yazın; biri zincirleme olsun.

Teslim

catalog.ttl + sorgular + RDFS çıkarımlarının elle listesi (hangi üçlü hangi kuraldan).

Çözümü Hafta 04'ün başında ele alacağız.

Değerlendirme ölçütleri

ÖlçütAğırlıkBeklenen
Turtle doğruluğu25%Ayrıştırılabilir, tipli literaller
Sözlük tasarımı30%Hiyerarşi gerekçeli
domain/range15%Tam ve tutarlı
SPARQL20%Zincirleme sorgu çalışıyor
Çıkarım listesi10%Kural eşlemesi doğru

Kaynaklar

  • W3C — RDF 1.1 Primer; RDF 1.1 Concepts and Abstract Syntax.
  • W3C — RDF Schema 1.1; RDF 1.1 Turtle.
  • W3C — SPARQL 1.1 Query Language.
  • Allemang & Hendler — Semantic Web for the Working Ontologist, Böl. 3–7.
  • Apache Jena belgeleri — Model API ve ARQ.

Özet  •  1 / 2

RDF: veri modeli

  • Her şey üçlüdür: özne, yüklem, nesne.
  • Paylaşılan IRI'ler grafları JOIN'siz birleştirir.
  • Literal tipi ihmal edilirse kurallar sessizce çalışmaz.
  • SPARQL grafı sorgular; CONSTRUCT yeni üçlü üretir ama kalıcı yazmaz.

Özet  •  2 / 2

RDFS ve sonraki adım

  • subClassOf, subPropertyOf, domain, range: dört çıkarım kuralı.
  • domain/range kısıt değil, çıkarım üretir.
  • Alerjen alt özellikleri, S7 kuralını tek satıra indirir.

Hafta 04'te

OWL temelleri: sınıf, özellik, birey, aksiyom; OWL Lite / DL / Full ve ayrıklık.

Ayrıca: Ödev 3'ün ayrıntılı çözümü.

Tekrar Soruları

Kendinizi sınayın

  1. Literal neden özne olamaz?
  2. Blank node'un birleştirmedeki sakıncası nedir?
  3. domain bildirimi hangi üçlüyü üretir?
  4. Alt özellik hiyerarşisi S7 kuralını nasıl kısaltır?
  1. CONSTRUCT ile SWRL arasındaki temel fark nedir?
  2. Adlandırılmış graf hangi soruyu cevaplar?
  3. RDFS ile ayrıklık neden yazılamaz?
  4. Aynı graf iki serileştirmede farklı görünür mü? Neden?

Alıştırma  •  Sınıf içi

Grafı tamamlayın

Yeni kişi TC_005: 16 yaşında, gluten alerjisi var, EAN_00001 seçti.

:TC_005 a :Person ; :hasAge ______ ; :hasAllergy ______ ; :ChooseProduct ______ .

Sorular

  1. Hangi RDFS çıkarımları üretilir?
  2. Risk zinciri kapanır mı? Hangi üçlü sayesinde?
  3. Bu kişi Adult olur mu? Neden?

Çözüm Hafta 04'te.